﻿using System;
using System.ComponentModel;
using System.Text;
using System.ServiceModel;
using System.Data.Common;

using Sinacor.Infra.Service.Security.Services;
using Sinacor.Servico.Bovespa.Comum.Service.ServiceImplementation;
using Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Enum;
using Sinacor.Servico.Bovespa.BovespaBase.Util;
using Sinacor.Servico.Bovespa.Ordens.Service;
using Sinacor.Servico.Bovespa.Ordens.Service.ServiceContract;
using System.Collections.Generic;


namespace Sinacor.Servico.Bovespa.Ordens.Service.ServiceImplementation
{
    [SinacorServiceBehavior]
    public class PreBoleto : ServiceContract.IPreBoleto
    {
        /// <summary>
        /// Metodo responsavel por realizar a consulta de pre-boletos
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public List<DataContract.Response.ConsultarPreBoletoResponse> ConsultarPreBoleto(DataContract.Request.ConsultarPreBoletoRequest request)
        {
            BusinessEntity.Ordem ordemBE = Translator.TranslateBetweenConsultarPreBoletoRequestAndOrdem.TranslateConsultarPreBoletoRequestToOrdem(request);
            BusinessLogic.PreBoleto preBoletoBL = new BusinessLogic.PreBoleto();
            List<BusinessEntity.PreBoleto> listaPreBoletos = preBoletoBL.ConsultarPreBoleto(ordemBE);

            return Translator.TranslateBetweenPreBoletoAndConsultarPreBoletoResponse.TranslatePreBoletoCollectionToConsultarPreBoletoResponseCollection(listaPreBoletos);
        }


        /// <summary>
        /// Metodo responsavel por realizar a consulta de pre-boletos de forma analitica
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public List<DataContract.Response.ConsultarPreBoletoAnaliticoResponse> ConsultarPreBoletoAnalitico(DataContract.Request.ConsultarPreBoletoAnaliticoRequest request)
        {
            BusinessEntity.Ordem ordemBE = Translator.TranslateConsultarPreBoletoAnaliticoRequest.ToOrdem(request);
            BusinessLogic.PreBoleto preBoletoBL = new BusinessLogic.PreBoleto();
            List<BusinessEntity.PreBoleto> listaPreBoletos = preBoletoBL.ConsultarPreBoletoAnalitico(ordemBE);

            return Translator.TranslateBetweenPreBoletoAndConsultarPreBoletoAnaliticoResponse.TranslatePreBoletoCollectionToPreBoletoAnaliticoResponseCollection(listaPreBoletos);

        }

        /// <summary>
        /// Metodo responsavel por realizar o casamento de pre-boletos
        /// Alteracoes:
        /// Diogo Milanez - 21/11/2007
        /// Parametro de entrada foi removido
        /// </summary>
        /// <returns></returns>
        ///[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public DataContract.Response.RealizarCasamentoResponse RealizarCasamentoPreBoleto(DataContract.Request.RealizarCasamentoPreBoletoRequest request)
        {
            DataContract.Response.RealizarCasamentoResponse casamentoResponse = new DataContract.Response.RealizarCasamentoResponse();

            BusinessEntity.Ordem ordemBE = Translator.TranslateBetweenRealizarCasamentoPreBoletoRequestAndOrdem.TranslateRealizarCasamentoPreBoletoRequestToOrdem(request);
            BusinessLogic.PreBoleto preBoletoBL = new BusinessLogic.PreBoleto();

            BusinessEntity.PreBoleto preBoletoBE = new BusinessEntity.PreBoleto();
            preBoletoBE.Ordem = ordemBE;

            BusinessEntity.RetornoCasamento retorno = preBoletoBL.RealizarCasamentoESP(preBoletoBE);

            return Translator
                .TranslateRetornoCasamento
                .ToRealizarCasamentoResponse(retorno);
        }
        
        /// <summary>
        /// Metodo responsavel por realizar o casamento de pre-boletos
        /// </summary>
        /// <returns></returns>
        public DataContract.Response.RealizarCasamentoResponse RealizarCasamentoPreBoletoFIN(DataContract.Request.RealizarCasamentoPreBoletoRequest request, DataContract.Enum.TipoCasamentoPreBoleto pTipoCasamentoPreBoleto)
        {
            DataContract.Response.RealizarCasamentoResponse casamentoResponse = new DataContract.Response.RealizarCasamentoResponse();

            BusinessEntity.Ordem ordemBE = Translator.TranslateBetweenRealizarCasamentoPreBoletoRequestAndOrdem.TranslateRealizarCasamentoPreBoletoRequestToOrdem(request);
            BusinessLogic.PreBoleto preBoletoBL = new BusinessLogic.PreBoleto();

            BusinessEntity.PreBoleto preBoletoBE = new BusinessEntity.PreBoleto();
            preBoletoBE.Ordem = ordemBE;

            BusinessEntity.RetornoCasamento retorno = preBoletoBL.RealizarCasamento(preBoletoBE, new Translator.TranslateTipoCasamentoPreBoletoToBusinessEntityEnum().Translate(pTipoCasamentoPreBoleto));

            return Translator
                .TranslateRetornoCasamento
                .ToRealizarCasamentoResponse(retorno);
        }



        /// <summary>
        /// Metodo responsavel por realizar a inclusao de um novo pre-boleto
        /// Alteracoes:
        /// Parametro de entrada passa a ser uma colecao de pre-boletos
        /// Retorno passou a ser void
        /// </summary>
        /// <param name="request">Colecao de pre-boletos para inclusao</param>
        ///[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public DataContract.Response.RealizarCasamentoResponse IncluirPreBoleto(List<DataContract.Request.IncluirPreBoletoRequest> request)
        {
            if (request == null)
                return null;

            List<BusinessEntity.PreBoleto> colecaoPreBoleto = Translator.TranslateBetweenIncluirPreBoletoRequestAndPreBoleto.TranslatePreBoletoRequestCollectionToPreBoletoCollection(request);

            BusinessLogic.PreBoleto preBoletoBL = new BusinessLogic.PreBoleto();
            BusinessEntity.RetornoCasamento retorno = preBoletoBL.IncluirPreBoleto(colecaoPreBoleto, true);

            return Translator
                .TranslateRetornoCasamento
                .ToRealizarCasamentoResponse(retorno);
        }


        /// <summary>
        /// Metodo responsavel por realizar a alteração do pré boleto
        /// </summary>
        /// <param name="request">Colecao de pre-boletos para inclusao</param>
        public DataContract.Response.RealizarCasamentoResponse AlterarPreBoleto(List<DataContract.Request.AlterarPreBoletoRequest> request)
        {
            if (request == null)
                return null;

            List<BusinessEntity.PreBoleto> colecaoPreBoleto = Translator.TranslateBetweenAlterarPreBoletoRequestAndPreBoleto.TranslatePreBoletoRequestCollectionToPreBoletoCollection(request);

            BusinessLogic.PreBoleto preBoletoBL = new BusinessLogic.PreBoleto();
            BusinessEntity.RetornoCasamento retorno = preBoletoBL.AlterarPreBoleto(colecaoPreBoleto);

            return Translator
                .TranslateRetornoCasamento
                .ToRealizarCasamentoResponse(retorno);
        }


        /// <summary>
        /// Metodo responsavel por realizar a exclusao de um pre-boleto
        /// </summary>
        /// <param name="request">colecao de pre-boletos para exclusao</param>
        ///[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public void ExcluirPreBoleto(List<DataContract.Request.ExcluirPreBoletoRequest> request)
        {
            List<BusinessEntity.PreBoleto> colecaoPreBoleto =
            Translator.TranslateBetweenPreBoletoExclusaoRequestAndPreBoleto.TranslatePreBoletoExclusaoRequestCollectionToPreBoletoCollection(request);

            BusinessLogic.PreBoleto preBoletoBL = new BusinessLogic.PreBoleto();

            preBoletoBL.ExcluirPreBoleto(colecaoPreBoleto, true);

            return;
        }

        /// <summary>
        /// Metodo responsavel por processar tres colecoes de de pre-boleto, 
        /// uma de inclusao,  exclusao e alteracao
        /// 20080421 13:44 - Rvaladao
        /// Alterada para receber boletos para alteração
        /// </summary>
        /// <param name="requestInclusao">colecao de pre-boletos para inclusao</param>
        /// <param name="requestExclusao">colecao de pre-boletos para exclusao</param>
        /// <param name="requestAlteracao">colecao de pre-boletos para alteracao</param>
        ///[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public DataContract.Response.RealizarCasamentoResponse ProcessarPreBoleto(List<DataContract.Request.IncluirPreBoletoRequest> requestInclusao, List<DataContract.Request.ExcluirPreBoletoRequest> requestExclusao, List<DataContract.Request.AlterarPreBoletoRequest> requestAlteracao)
        {
            //traduzir a lista de dataContracts para BE
            List<BusinessEntity.PreBoleto> colecaoPreBoletoExclusao = Translator.TranslateBetweenPreBoletoExclusaoRequestAndPreBoleto.TranslatePreBoletoExclusaoRequestCollectionToPreBoletoCollection(requestExclusao);
            List<BusinessEntity.PreBoleto> colecaoPreBoletoInclusao = Translator.TranslateBetweenIncluirPreBoletoRequestAndPreBoleto.TranslatePreBoletoRequestCollectionToPreBoletoCollection(requestInclusao);
            List<BusinessEntity.PreBoleto> colecaoPreBoletoAlteracao = Translator.TranslateBetweenAlterarPreBoletoRequestAndPreBoleto.TranslatePreBoletoRequestCollectionToPreBoletoCollection(requestAlteracao);
            //processar BE na BL
            BusinessEntity.RetornoCasamento beRetornoCasamento = (new BusinessLogic.PreBoleto()).ProcessarPreBoleto(colecaoPreBoletoInclusao, colecaoPreBoletoExclusao, colecaoPreBoletoAlteracao);

            ///traduzir a BE para DC Response
            return Translator.TranslateRetornoCasamento.ToRealizarCasamentoResponse(beRetornoCasamento);
        }


        /// <summary>
        /// Autor: Eduardo Sertorio
        /// Data: 07/12/2007
        /// Validar Data do Pregao para Pre-Boleto na tela de Manutencao de Ordens Abertas no Mega Bolsa 
        /// 
        /// Data : 28/04/2008
        /// Autor: Eduardo Sertorio
        /// Obs. : Operacao tornou-se generica para Ordem e OrdemMegaBolsa
        /// Obs. : Alterado nome de (ValidarDataPregaoPreBoletoOrdemMegaBolsa) para (ValidarDataPregaoPreBoletoOrdemMegaBolsa)
        /// Obs. : Alterado contrato de (ValidarDataPregaoPreBoletoOrdemMegaBolsaRequest) para (ValidarDataPregaoPreBoletoOrdemRequest)
        /// </summary>
        /// <param name="request"></param>
        public void ValidarDataPregaoPreBoletoOrdem(DataContract.Request.ValidarDataPregaoPreBoletoOrdemRequest request)
        {
            BusinessEntity.Ordem beOrdemAlterada = new BusinessEntity.Ordem();

            beOrdemAlterada.DataOrdem = request.DataOrdem;
            beOrdemAlterada.NumeroOrdem = request.NumeroOrdem;
            beOrdemAlterada.NumeroOrdemSubSequencia = request.NumeroOrdemSubSequencia;
            //20080504 17:49 - Rvaladao
            //Parametro para verificar a permissão do usuário alterar pré boleto.
            //Resolução bug 3967
            beOrdemAlterada.DataValidade = request.DataValidade;

            //executar
            (new BusinessLogic.Ordem()).ValidarDataPregaoPreBoletoOrdem(beOrdemAlterada, request.DataPregaoPreBoleto);
        }

    }
}
